home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d3 / ddjhptxt.arc / SCHULMAN.LST < prev    next >
File List  |  1990-06-05  |  5KB  |  194 lines

  1. LISTING ONE
  2.  
  3. ;       protmode.asm -- 286 protected-mode instructions
  4. ;       requires MASM 5.0 or higher or TASM
  5. ;       masm -ml protmode;
  6. ;       or, tasm -ml protmode;
  7.  
  8.         dosseg
  9.  
  10.         .286p
  11.         .model large
  12.         .code
  13.  
  14.         public  _lsl, _lar, _verr, _verw, _sgdt, _sidt, _sldt
  15.  
  16. ;       extern unsigned far lsl(unsigned short sel);
  17. ;       input:   selector
  18. ;       output:  if valid and visible at current protection level,
  19. ;                   return segment limit (which is 0 for 1-byte seg!)
  20. ;                else
  21. ;                   return 0
  22. ;
  23. _lsl    proc
  24.         enter   0, 0
  25.         sub     ax, ax
  26.         lsl     ax, [bp+6]
  27.         leave
  28.         ret
  29. _lsl    endp
  30.  
  31. ;       extern unsigned short far lar(unsigned short sel);
  32. ;       input:   selector
  33. ;       output:  if valid and visible at current protection level,
  34. ;                   return access rights (which will never be 0)
  35. ;                else
  36. ;                   return 0
  37. ;
  38. _lar    proc
  39.         enter   0, 0
  40.         sub     ax, ax
  41.         lar     ax, [bp+6]
  42.         shr     ax, 8
  43.         leave
  44.         ret
  45. _lar    endp
  46.  
  47. ;       extern BOOL far verr(unsigned short sel);
  48. ;       input:   selector
  49. ;       output:  valid for reading ? 1 : 0
  50. ;
  51. _verr   proc
  52.         enter   0, 0
  53.         mov     ax, 1
  54.         verr    word ptr [bp+6]
  55.         je      short verr_okay
  56.         dec     ax
  57. verr_okay:
  58.         leave
  59.         ret
  60. _verr   endp
  61.  
  62. ;       extern BOOL far verw(unsigned short sel);
  63. ;       input:   selector
  64. ;       output:  valid for writing ? 1 : 0
  65. ;
  66. _verw   proc
  67.         enter   0, 0
  68.         mov     ax, 1
  69.         verw    word ptr [bp+6]
  70.         je      short verw_okay
  71.         dec     ax
  72. verw_okay:
  73.         leave
  74.         ret
  75. _verw   endp
  76.  
  77. ;       extern void far sgdt(void far *gdt);
  78. ;       input:   far ptr to 6-byte structure
  79. ;       output:  fills structure with GDTR
  80. ;
  81. _sgdt   proc
  82.         enter 0, 0
  83.         les   bx, dword ptr [bp+6]
  84.         sgdt  fword ptr es:[bx]
  85.         leave
  86.         ret
  87. _sgdt   endp
  88.  
  89. ;       extern void far sidt(void far *idt);
  90. ;       input:   far ptr to 6-byte structure
  91. ;       output:  fills structure with IDTR
  92. ;
  93. _sidt   proc
  94.         enter 0, 0
  95.         les   bx, dword ptr [bp+6]
  96.         sidt  fword ptr es:[bx]
  97.         leave
  98.         ret
  99. _sidt   endp
  100.  
  101. ;
  102. ;       extern unsigned short sldt(void);
  103. ;       input:   none
  104. ;       output:  Local Descriptor Table register (LDTR)
  105. ;
  106. _sldt   proc
  107.         sldt  ax
  108.         ret
  109. _sldt   endp
  110.  
  111.         end
  112.  
  113.  
  114. LISTING TWO
  115.  
  116. /* PROTMODE.H */
  117.  
  118. typedef enum { FALSE, TRUE } BOOL;
  119. #ifdef InstantC
  120. unsigned far lsl(unsigned short sel)        {extern;}
  121. unsigned short far lar(unsigned short sel)  {extern;}
  122. BOOL far verr(unsigned short sel)           {extern;}
  123. BOOL far verw(unsigned short sel)           {extern;}
  124. void far sgdt(void far *gdt)                {extern;}
  125. void far sidt(void far *idt)                {extern;}
  126. unsigned short sldt(void)                   {extern;}
  127. #else
  128. extern unsigned far lsl(unsigned short sel);
  129. extern unsigned short far lar(unsigned short sel);
  130. extern BOOL far verr(unsigned short sel);
  131. extern BOOL far verw(unsigned short sel);
  132. extern void far sgdt(void far *gdt);
  133. extern void far sidt(void far *idt);
  134. extern unsigned short sldt(void);
  135. #endif
  136.  
  137.  
  138. LISTING THREE
  139.  
  140. /* BROWSE.C */
  141.  
  142. #ifdef InstantC
  143. #loadobj "protmode.obj"
  144. #endif
  145. #include "protmode.h"
  146.  
  147. void browse()
  148. {
  149.     unsigned long addr;
  150.     unsigned i, acc;
  151.     for (i=0; i<0xFFFF; i++)        // for all possible selectors
  152.         if (acc = lar(i))           // if a valid selector
  153.         {
  154.             addr = D16AbsAddress(MK_FP(i,0));
  155.             printf("%04X %06lX LAR=%02X LSL=%04X PL=%02X %s %s %s %s\n",
  156.                 i,                              // selector
  157.                 addr,                           // physical base addr
  158.                 acc,                            // access-rights byte
  159.                 lsl(i),                         // segment limit
  160.                 i & 3,                          // protection level
  161.                 verr(i) ? "VERR" : "    ",      // readable?
  162.                 verw(i) ? "VERW" : "    ",      // writeable?
  163.                 i & 4 ? "LDT" : "GDT",          // which table?
  164.                 i == addr >> 4 ? "TRANS" : ""); // transparent?
  165.         }
  166. }
  167.  
  168.  
  169. LISTING FOUR
  170.  
  171. /* SEL.C */
  172.  
  173. void sel(void far *fp)
  174. {
  175.     extern DESCRIPTOR far *gdt;
  176.     extern DESCRIPTOR far *ldt;
  177.     unsigned seg = FP_SEG(fp);
  178.     unsigned index = seg >> 3;
  179.     DESCRIPTOR far *dt = (seg & 4) ? gdt : ldt; // table indicator
  180.     ACCESS_RIGHTS *pacc = (ACCESS_RIGHTS *) &dt[index].access;
  181.     printf("SEL=%04X ADDR=%02X%04X LIMIT=%04X ACCESS=%d%c%c%c%c%c%c\n",
  182.         seg, dt[index].addr_hi, dt[index].addr_lo, dt[index].limit,
  183.         // display access rights as if they were file attributes:
  184.         pacc->dpl,
  185.         pacc->accessed ? 'a' : '-',
  186.         pacc->read_write ? ((pacc->code_data) ? 'r' : 'w') : '-',
  187.         pacc->conf_exp ? ((pacc->code_data) ? 'f' : 'e') : '-',
  188.         pacc->code_data ? 'c' : 'd',
  189.         pacc->xsystem ? '-' : 's',
  190.         pacc->present ? 'p' : '-');
  191. }
  192.  
  193.  
  194.